package com.h.principle;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.ApplicationScope;
import org.springframework.web.context.annotation.RequestScope;
import org.springframework.web.context.annotation.SessionScope;

/**
 * Bean 的作用域是指 Bean在Spring框架中的某种行为方式
 * 六种方式：
 * 默认下为单例模式
 * 1.singleton: 单例作用域 (产生一个实例)
 * 2.prototype: 原型作用域 (产生多个实例)
 * 3.request: 请求作用域 (每次的请求对应的实例不一样)
 * 4.session: 会话作用域 (每一次会话的实例都不一样，比如不同的浏览器进行访问)
 * 5.application: 全局作用域 (也是一个实例)
 * 6.websocket: HTTP WebSocket作用域
 */
@Component
public class DogComponent {
    @Bean
    public Dog dog() {
        return new Dog();
    }

    @Bean
    public Dog singleDog() {
        return new Dog();
    }

    @Bean
    @Scope("prototype")
    public Dog prototypeDog() {
        return new Dog();
    }

    @Bean
    @RequestScope
    public Dog requestDog() {
        return new Dog();
    }

    @Bean
    @SessionScope
    public Dog sessionDog() {
        return new Dog();
    }

    @Bean
    @ApplicationScope
    public Dog applicationDog() {
        return new Dog();
    }
}
